#ifndef MAPA_H_
#define MAPA_H_
#include "Casillero.h"
#include "Coordenada.h"
#include "IMovible.h"
#include "IOcupante.h"
#include "MaterialFisico.h"
#include <vector>

class Mapa{
private:
	int tamanio;
        std::vector< std::vector<Casillero*> > cuadricula;
	//std::vector< std::vector<Casillero*> > cuadricula(tamanio, std::vector<Casillero*>(tamanio));

public:
	/* Constructor. */
        Mapa();
	Mapa(int tam);
	/* Destructor. */
	~Mapa();
        int getTamanio();
        void inicializar();
        bool fueraDeRango(Coordenada nuevaCoord);
        bool posicionBloqueada(Coordenada nuevaCoord);
	/* le asigna una nueva coordenada al movible segun la coordenada
	 * recibida desde el cliente. Verifica colisiones y dependiendo de
         * estas mueve o no el movible. */
	bool moverElemento(IMovible* movible);
        bool hayColision(Coordenada coord);
        void resolverColisiones(IMovible* movible);
	/* Ubica el elemento en el casillero correspondiente a la coordenada.*/
	void ubicarElemento(IOcupante* elemento, Coordenada coord); 
	/* Saca el elemento del casillero correspondiente a la coordenada.*/
	void sacarElemento(IOcupante* elemento, Coordenada coord);
        IOcupante* obtenerOcupante(Coordenada coord);
        MaterialFisico* obtenerMaterial(Coordenada coord);
        void establecerMaterial(MaterialFisico* material, Coordenada coordenada);

};

#endif